using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._MultidimensionTools
{
    /// <summary>
    /// <para>Make Multidimensional Raster Layer</para>
    /// <para>Creates a raster layer from a multidimensional raster dataset or a multidimensional raster layer  by slicing data along defined variables and dimensions.</para>
    /// <para>通过沿定义的变量和维度对数据进行切片，从多维栅格数据集或多维栅格图层创建栅格图层。</para>
    /// </summary>    
    [DisplayName("Make Multidimensional Raster Layer")]
    public class MakeMultidimensionalRasterLayer : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public MakeMultidimensionalRasterLayer()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_multidimensional_raster">
        /// <para>Input Multidimensional Raster</para>
        /// <para><xdoc>
        ///   <para>The input multidimensional raster dataset.</para>
        ///   <para>Supported inputs include netCDF, GRIB, HDF or CRF files, a multidimensional mosaic dataset, a multidimensional image service, an OPeNDAP URL, or a multidimensional raster layer.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入多维栅格数据集。</para>
        ///   <para>支持的输入包括 netCDF、GRIB、HDF 或 CRF 文件、多维镶嵌数据集、多维影像服务、OPeNDAP URL 或多维栅格图层。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_out_multidimensional_raster_layer">
        /// <para>Output Multidimensional Raster Layer</para>
        /// <para>The output multidimensional raster layer.</para>
        /// <para>输出多维栅格图层。</para>
        /// </param>
        public MakeMultidimensionalRasterLayer(object _in_multidimensional_raster, object _out_multidimensional_raster_layer)
        {
            this._in_multidimensional_raster = _in_multidimensional_raster;
            this._out_multidimensional_raster_layer = _out_multidimensional_raster_layer;
        }
        public override string ToolboxName => "Multidimension Tools";

        public override string ToolName => "Make Multidimensional Raster Layer";

        public override string CallName => "md.MakeMultidimensionalRasterLayer";

        public override List<string> AcceptEnvironments => ["cellSize", "compression", "configKeyword", "extent", "geographicTransformations", "nodata", "outputCoordinateSystem", "parallelProcessingFactor", "rasterStatistics", "resamplingMethod", "scratchWorkspace", "snapRaster", "tileSize", "workspace"];

        public override object[] ParameterInfo => [_in_multidimensional_raster, _out_multidimensional_raster_layer, _variables, _dimension_def.GetGPValue(), _dimension_ranges, _dimension_values, _dimension, _start_of_first_iteration, _end_of_first_iteration, _iteration_step, _iteration_unit.GetGPValue(), _template, _dimensionless.GetGPValue()];

        /// <summary>
        /// <para>Input Multidimensional Raster</para>
        /// <para><xdoc>
        ///   <para>The input multidimensional raster dataset.</para>
        ///   <para>Supported inputs include netCDF, GRIB, HDF or CRF files, a multidimensional mosaic dataset, a multidimensional image service, an OPeNDAP URL, or a multidimensional raster layer.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输入多维栅格数据集。</para>
        ///   <para>支持的输入包括 netCDF、GRIB、HDF 或 CRF 文件、多维镶嵌数据集、多维影像服务、OPeNDAP URL 或多维栅格图层。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Multidimensional Raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_multidimensional_raster { get; set; }


        /// <summary>
        /// <para>Output Multidimensional Raster Layer</para>
        /// <para>The output multidimensional raster layer.</para>
        /// <para>输出多维栅格图层。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Multidimensional Raster Layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_multidimensional_raster_layer { get; set; }


        /// <summary>
        /// <para>Variables</para>
        /// <para>The variables that will be included in the output multidimensional raster layer. If no variable is specified, the first variable will be used.</para>
        /// <para>将包含在输出多维栅格图层中的变量。如果未指定变量，则将使用第一个变量。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Variables")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _variables { get; set; } = null;


        /// <summary>
        /// <para>Dimension Definition</para>
        /// <para><xdoc>
        ///   <para>Specifies the method that will be used to slice the dimension.</para>
        ///   <bulletList>
        ///     <bullet_item>All—The full range for each dimension will be used. This is the default.</bullet_item><para/>
        ///     <bullet_item>By Ranges—The dimension will be sliced using a range or a list of ranges.</bullet_item><para/>
        ///     <bullet_item>By Iteration—The dimension will be sliced over a specified interval size.</bullet_item><para/>
        ///     <bullet_item>By Values—The dimension will be sliced using a list of dimension values.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将用于对维度进行切片的方法。</para>
        ///   <bulletList>
        ///     <bullet_item>全部—将使用每个维度的完整范围。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>按范围 - 将使用范围或范围列表对维度进行切片。</bullet_item><para/>
        ///     <bullet_item>按迭代 - 尺寸将在指定的间隔大小上进行切片。</bullet_item><para/>
        ///     <bullet_item>按值 - 将使用维度值列表对维度进行切片。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Dimension Definition")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _dimension_def_value _dimension_def { get; set; } = _dimension_def_value._ALL;

        public enum _dimension_def_value
        {
            /// <summary>
            /// <para>All</para>
            /// <para>All—The full range for each dimension will be used. This is the default.</para>
            /// <para>全部—将使用每个维度的完整范围。这是默认设置。</para>
            /// </summary>
            [Description("All")]
            [GPEnumValue("ALL")]
            _ALL,

            /// <summary>
            /// <para>By Values</para>
            /// <para>By Values—The dimension will be sliced using a list of dimension values.</para>
            /// <para>按值 - 将使用维度值列表对维度进行切片。</para>
            /// </summary>
            [Description("By Values")]
            [GPEnumValue("BY_VALUE")]
            _BY_VALUE,

            /// <summary>
            /// <para>By Ranges</para>
            /// <para>By Ranges—The dimension will be sliced using a range or a list of ranges.</para>
            /// <para>按范围 - 将使用范围或范围列表对维度进行切片。</para>
            /// </summary>
            [Description("By Ranges")]
            [GPEnumValue("BY_RANGES")]
            _BY_RANGES,

            /// <summary>
            /// <para>By Iteration</para>
            /// <para>By Iteration—The dimension will be sliced over a specified interval size.</para>
            /// <para>按迭代 - 尺寸将在指定的间隔大小上进行切片。</para>
            /// </summary>
            [Description("By Iteration")]
            [GPEnumValue("BY_ITERATION")]
            _BY_ITERATION,

        }

        /// <summary>
        /// <para>Range</para>
        /// <para><xdoc>
        ///   <para>The range or list of ranges for the specified dimension.</para>
        ///   <para>This slices the data based on the dimension name and the minimum and maximum values for the range. This parameter is required when the Dimension Definition parameter is set to By Ranges.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定维度的范围或范围列表。</para>
        ///   <para>这将根据维度名称以及范围的最小值和最大值对数据进行切片。当“维度定义”参数设置为“按范围”时，此参数是必需的。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Range")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _dimension_ranges { get; set; } = null;


        /// <summary>
        /// <para>Values</para>
        /// <para>A list of values for the specified dimension. This parameter is required when the Dimension Definition parameter is set to By Values.</para>
        /// <para>指定维度的值列表。当“维度定义”参数设置为“按值”时，此参数是必需的。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Values")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _dimension_values { get; set; } = null;


        /// <summary>
        /// <para>Dimension</para>
        /// <para>The dimension along which the variables will be sliced. This parameter is required when the Dimension Definition parameter is set to By Iteration.</para>
        /// <para>将沿其对变量进行切片的维度。当“维度定义”参数设置为“按迭代”时，该参数是必需的。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Dimension")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _dimension { get; set; } = null;


        /// <summary>
        /// <para>Start of first iteration</para>
        /// <para>The beginning of the first interval. This interval is used to iterate through the dataset. This parameter is required when the Dimension Definition parameter is set to By Iteration.</para>
        /// <para>第一个间隔的开始。此间隔用于循环访问数据集。当“维度定义”参数设置为“按迭代”时，该参数是必需的。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Start of first iteration")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _start_of_first_iteration { get; set; } = null;


        /// <summary>
        /// <para>End of first iteration</para>
        /// <para>The end of the first interval. This interval is used to iterate through the dataset. This parameter is required when the Dimension Definition parameter is set to By Iteration.</para>
        /// <para>第一个间隔的结束。此间隔用于循环访问数据集。当“维度定义”参数设置为“按迭代”时，该参数是必需的。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("End of first iteration")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _end_of_first_iteration { get; set; } = null;


        /// <summary>
        /// <para>Step</para>
        /// <para>The frequency with which the data will be sliced. This parameter is required when the Dimension Definition parameter is set to By Iteration.</para>
        /// <para>对数据进行切片的频率。当“维度定义”参数设置为“按迭代”时，该参数是必需的。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Step")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _iteration_step { get; set; } = null;


        /// <summary>
        /// <para>Unit</para>
        /// <para>Specifies the iteration unit. This parameter is required when the Dimension Definition parameter is set to By Iteration and the Dimension parameter is set to StdTime.</para>
        /// <para>指定迭代单元。当“维度定义”参数设置为“By Iteration”，维度参数设置为“StdTime”时，该参数是必需的。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Unit")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _iteration_unit_value? _iteration_unit { get; set; } = null;

        public enum _iteration_unit_value
        {
            /// <summary>
            /// <para>Hours</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Hours")]
            [GPEnumValue("HOURS")]
            _HOURS,

            /// <summary>
            /// <para>Days</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Days")]
            [GPEnumValue("DAYS")]
            _DAYS,

            /// <summary>
            /// <para>Weeks</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Weeks")]
            [GPEnumValue("WEEKS")]
            _WEEKS,

            /// <summary>
            /// <para>Months</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Months")]
            [GPEnumValue("MONTHS")]
            _MONTHS,

            /// <summary>
            /// <para>Years</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("Years")]
            [GPEnumValue("YEARS")]
            _YEARS,

        }

        /// <summary>
        /// <para>Extent</para>
        /// <para><xdoc>
        ///   <para>The extent (bounding box) of the layer. Choose the appropriate Extent option for the layer.</para>
        ///   <bulletList>
        ///     <bullet_item>Default—The extent will be based on the maximum extent of all participating inputs. This is the default.</bullet_item><para/>
        ///     <bullet_item>Current Display Extent—The extent is equal to the data frame or visible display. The option is not available when there is no active map.</bullet_item><para/>
        ///     <bullet_item>As Specified Below—The extent will be based on the minimum and maximum extent values specified.</bullet_item><para/>
        ///     <bullet_item>Browse—The extent will be based on an existing dataset.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>图层的范围（边界框）。为图层选择适当的范围选项。</para>
        ///   <bulletList>
        ///     <bullet_item>默认值 - 范围将基于所有参与输入的最大范围。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>当前显示范围 - 范围等于数据框或可见显示。当没有活动地图时，该选项不可用。</bullet_item><para/>
        ///     <bullet_item>如下所述 - 范围将基于指定的最小和最大范围值。</bullet_item><para/>
        ///     <bullet_item>浏览 - 范围将基于现有数据集。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Extent")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _template { get; set; } = null;


        /// <summary>
        /// <para>Dimensionless</para>
        /// <para><xdoc>
        ///   <para>Specifies whether the layer will have dimension values. This parameter is only active if a single slice is selected to create a layer.
        ///   <bulletList>
        ///     <bullet_item>Checked—The layer will not have dimension values.  </bullet_item><para/>
        ///     <bullet_item>Unchecked—The layer will have dimension values. This is the default.  </bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        /// <para>指定图层是否具有维度值。仅当选择单个切片创建图层时，此参数才处于活动状态。
        ///   <bulletList>
        ///     <bullet_item>选中 - 图层将不具有尺寸值。</bullet_item><para/>
        ///     <bullet_item>未选中 - 图层将具有尺寸值。这是默认设置。 </bullet_item><para/>
        ///   </bulletList>
        ///   </para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Dimensionless")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _dimensionless_value _dimensionless { get; set; } = _dimensionless_value._false;

        public enum _dimensionless_value
        {
            /// <summary>
            /// <para>NO_DIMENSIONS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NO_DIMENSIONS")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>DIMENSIONS</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("DIMENSIONS")]
            [GPEnumValue("false")]
            _false,

        }

        public MakeMultidimensionalRasterLayer SetEnv(object cellSize = null, object compression = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object nodata = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object rasterStatistics = null, object resamplingMethod = null, object scratchWorkspace = null, object snapRaster = null, double[] tileSize = null, object workspace = null)
        {
            base.SetEnv(cellSize: cellSize, compression: compression, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, nodata: nodata, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, rasterStatistics: rasterStatistics, resamplingMethod: resamplingMethod, scratchWorkspace: scratchWorkspace, snapRaster: snapRaster, tileSize: tileSize, workspace: workspace);
            return this;
        }

    }

}